package com.huang;

import java.util.Arrays;
import java.util.PrimitiveIterator;
import java.util.Scanner;

/**
 * @author HuangShen
 * @Description 描述一个集合的抽象数据类型Set，其中所有元素为正整数，集合的基本运算包括：
 * （1）创建一个集合，由用户自己指定元素个数和元素值。
 * （2）输出一个集合的所有元素。
 * （3）判断一个元素是否在一个集合中。
 * （4）求两个集合的并集。
 * （5）求两个集合的差集。
 * （6）求两个集合的交集。
 * 在此基础上设计集合的顺序存储结构，并实现各基本运算的算法。
 * 1.纯集合  2.顺序存储  3.对空间不限制 4.用动态数组
 */
public class Operation {

    public static void main(String[] args) {
        MySet mySet = new MySet();
        MySet mySet1 = new MySet();
        System.out.println(mySet.isHave(2));
        System.out.print("并集");
        for (int i : mySet.and(mySet1)) {
            System.out.print(i+" ");
        }
        System.out.println();
        System.out.print("交集");
        for (int i : mySet.jiaoji(mySet1)) {
            System.out.print(i+" ");
        }
        System.out.println();
        System.out.print("差集");
        for (int i : mySet.sub(mySet1)) {
            System.out.print(i+" ");
        }

    }


}


class MySet {
    private int[] data ={};
    private int length;

//     * （1）创建一个集合，由用户自己指定元素个数和元素值。
    public MySet() {
        System.out.print("请输入元素个数（以空格隔开）：");
        int length = new Scanner(System.in).nextInt();
        this.data = new int[length];
        System.out.print("请输入元素值只能包含 空格分开:");
        String[] strings = new Scanner(System.in).nextLine().split(" ");
        if (strings.length!=length){
           throw new RuntimeException("输入数据非法");

        }
        for (int i = 0; i < length; i++) {
            this.data[i] = Integer.parseInt(strings[i]);
            this.length++;
        }
        System.out.print("读取到的数据为: ");
        print();
    }

//     * （2）输出一个集合的所有元素。
    public void  print(){
        PrimitiveIterator.OfInt iterator = Arrays.stream(data).iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next()+" ");
        }
        System.out.println();
    }
//    * （3）判断一个元素是否在一个集合中。
    public boolean isHave(int e){
        for (int datum : data) {
           if (e==datum) return true;
        }
        return false;

    }


    //     * （4）求两个集合的并集。
    public int[] and(MySet set){
        if (set.length<=0){
            return null;
        }else {
            int[] ints = new int[length + set.length];
            for (int i = 0; i < data.length; i++) {
                ints[i]=data[i];
            }
            int k=length;
            for (int i = 0; i < ints.length; i++) {
                if (i>=set.length) break;
                if(set.data[i]==ints[i]) {
                    continue;
                }
                else  {
                    ints[k++]=set.data[i];
                }
            }
            return ints;
        }
    }

    //     * （5）求两个集合的差集。
    public int[] sub(MySet set){
        if (set.length<=0){
            return null;
        }else {
            int[] ints = new int[length + set.length];
            int k=0;
            for (int datum : data) {
                if (!set.isHave(datum)) {
                    ints[k++]=datum;
                }
            }
            for (int datum : set.data) {
                if (!isHave(datum)) {
                    ints[k++]=datum;
                }
            }




            return ints;
        }
    }

//* （6）求两个集合的交集。
    public int [] jiaoji(MySet set){

        if (set.length<=0){
            return null;
        }else {
            int[] ints = new int[length<set.length?length:set.length];
            int k=0;

            if (length<set.length){
                for (int datum : data) {
                    if (set.isHave(datum)) {
                        ints[k++]=datum;
                    }
                }

            }else {
                for (int datum : set.data) {
                    if (isHave(datum)) {
                        ints[k++]=datum;
                    }
                }
            }






            return ints;
        }
    }




}
